// 1. 创建一个新的axios实例
// 2. 请求拦截器，如果有token进行头部携带
// 3. 响应拦截器：1. 剥离无效数据  2. 处理token失效
// 4. 导出一个函数，调用当前的axsio实例发请求，返回值promise
import axios from 'axios'
import { message } from 'ant-design-vue'
import router from '@/router/index'
//开发环境使用''  正式环境使用正式环境的
const baseURL = import.meta.env.VITE_APP_BASE_API
const instance = axios.create({
    baseURL,
    timeout: 10000
})
// 请求拦截器
instance.interceptors.request.use(
    (config) => {
        let access_token = JSON.parse(sessionStorage.getItem('user'))
            ? JSON.parse(sessionStorage.getItem('user')).access_token
            : null
        let token_type = JSON.parse(sessionStorage.getItem('user'))
            ? JSON.parse(sessionStorage.getItem('user')).token_type
            : null
        let Token = `${token_type} ${access_token}`
        if (config.url !== '/api/auth/login') {
            config.headers.Authorization = Token
        }
        return config
    },
    (error) => {
        return Promise.reject(error)
    }
)

// 响应拦截器 res => res.data  取出data数据，将来调用接口的时候直接拿到的就是后台的数据
instance.interceptors.response.use(
    (res) => res.data,
    //这里根据数据字典做全局的错误统一处理
    (error) => {
        if (error && error.response) {
            switch (error.response.status) {
                case 400:
                    error.message = '错误请求'
                    break
                case 401:
                    error.message = '用户没有权限(令牌、用户名、密码错误)'
                    break
                case 403:
                    error.message = '拒绝访问'
                    break
                case 404:
                    error.message = '请求错误,未找到该资源'
                    break
                case 405:
                    error.message = '请求方法未允许'
                    break
                case 408:
                    error.message = '请求超时'
                    break
                case 500:
                    error.message = '服务器端出错'
                    break
                case 501:
                    error.message = '网络未实现'
                    break
                case 502:
                    error.message = '网络错误'
                    break
                case 503:
                    error.message = '服务不可用'
                    break
                case 504:
                    error.message = '网络超时'
                    break
                case 505:
                    error.message = 'http版本不支持该请求'
                    break
                default:
                    error.message = `连接错误${error.response.status}`
            }
        }
        message.error(error.message)
        if (error.response.status === 401) {
            sessionStorage.clear()
            router.push('/login')
        }
        return Promise.reject(error)
    }
)
// 请求工具函数
export default (url, method, submitData, responseType) => {
    return instance({
        url,
        method,
        [method.toLowerCase() === 'get' ? 'params' : 'data']: submitData,
        responseType
    })
}
